                     [ Target: VCT #2 ]

 pH#2 .............F.u.l.l..R.e.v.e.r.s.e............. [    #Sadrzaj    ]
 0x01 ................................................ [ Intro          ]
 0x02 ................................................ [ Tools of trade ]
 0x03 ................................................ [ Unpacking      ]
 0x04 ................................................ [ Fishing        ]
 0x05 ................................................ [ Outro & Greetz ]


--[ 0x01 ]----------------------------------------------[     Intro     ]

  Posto  smo  uspesno crackovali prvi VCT crackme vreme je da predjemo na
drugi.  Kao i prvi i ovaj drugi je izuzetno lak stoga citanje ovog teksta
ne  preporucujem  iskusnim  reverserima. Izgleda da se tim VCT potrudio i
napravio  jednu veoma lepu gradacisku kombinaciju crackmea po tezini. Ovo
znaci  da  su  prva dva namenjena pocetnicima dok su ostala tri manje ili
vise  izazovna  i za iskusnije reversere. Sve u svemu odlicni crackmei za
vezbanje...
    Ako  pogledate  fajl  vct.nfo  videcete  da  je  ovaj  crackme  veoma
jednostavan. Potrebno je pronaci tacan seriski broj koji ce kada se unese
pokazati  da  program registrova. Ali na zalost po pocetnike ovaj problem
je  dodatno  otezan cinjenicom da je program zapakovan sa FSGom. Neka vas
ova    cinjenica  ne  plasi  FSG  je  jedan  jako  jednostavan  paker  za
odpakivanje, ali je istovremeno odlican paker!

--[ 0x02 ]---------------------------------------------[ Tools of trade ]

  Da bi smo resili ovaj crackme, trebace nam neki reverserski alati:

 [+] OllyDBG v.1.10 .................................. http://www.wasm.ru
 [+] LordPE Delux .................................... http://www.wasm.ru
 [+] ImpRec v.1.6 .................................... http://www.wasm.ru
 [+] PeID v0.93 ...................................... http://www.wasm.ru
 [+] HexDecChar v.0.4a ....................... http://ap0x.headcoders.net

  i naravno meta:

 [+] VCT #2 .......................................... my.target2.zip

  Svi  ovi alati su neophodni svakom reverseru pa predlazem da ako ih vec
nemate,  podhitno  ih  nabavite! Bez njih se dalje citanje ovog teksta ne
isplati!                                                                 

--[ 0x03 ]---------------------------------------------[    Unpacking   ]

  Pakeri  kao  vrsta  koda  koji se koriste za smanjivanje velicine i/ili
zastitu koda od reversovanja se odlikuju po cinjenici da postavljaju svoj
cesto isti po sadrzaju kod ispred koda koji ce se odpakovati. Ovaj kod je
specifican  za  svaki  paker  pa  ce  se odpakivanje svakog razlikovati u
detaljima ali postupak ce svugde biti isti:

  [1] Pronaci OEP pakovanog koda
  [2] Uraditi full dump
  [3] Uraditi popravku OEPa i importa

  Prva tacka sa ove liste se relativno lako nadje ako poznajete osnove PE
fajlova.  Bez  obzira na ovo potrebno je otvoriti nasu metu pomocu Ollya,
sto ce nam pruziti uvid u takozvani packer OEP. Ovaj OEP predstavlja prvu
linuju  koda koja ce se izvrsiti, a istovremeno pripada delu koda pakera.
Nasuprot ovoga postoji i takozvani pravi OEP koji predstavlja prvu liniju
koda  koja  se  izvrsava odmah posle izvrsenja packerovog koda. Ova druga
linija  je  istovetna  prvoj liniju koda nepakovanog programa i stoga ona
predstavlja pravi OEP!
  Dakle kada zapocnemo sa odpakivanjem, zapakovane mete, prva linija koda
pakovanog programa ce izgledati ovako:

00405000 >  BB D0014000     MOV EBX,vct_crac.004001D0
00405005    BF 00104000     MOV EDI,vct_crac.00401000
0040500A    BE 00404000     MOV ESI,vct_crac.00404000
0040500F    53              PUSH EBX
00405010    E8 0A000000     CALL vct_crac.0040501F
00405015    02D2            ADD DL,DL
00405017    75 05           JNZ SHORT vct_crac.0040501E
00405019    8A16            MOV DL,BYTE PTR DS:[ESI]
0040501B    46              INC ESI
0040501C    12D2            ADC DL,DL
0040501E    C3              RET

  Ovaj prvi deo koda mozete slobodno izvrsiti sa F8. Ovo nije tako u svim
situacijama  jer u nekim slucajevima CALLovi u blizini OEPa odmah vode do
pravog OEPa. Stoga treba proveravati vecinu "sumljivih" CALLova ulaskom u
njih  sa  F7.  Ali  kod  FSGa  ovo  nije slucaj pa se stoga slobodno moze
izvrsiti sve komande do, ukljucujuci i, RET komandu.
  Trik  kod  pronalazenja  OEPa  je  u tome da treba pronaci mesto gde se
konacno regenerise import tablica. Ovo mesto cete prepoznati po cinjenici
da se .dll fajlovi koji sadrze APIje koje program koji odpakujemo poziva.
To mesto je specificno po APIju LoadLibraryA koji se koristi za dinamicko
ucitavanje  raznih .dll fajlova. Stoga ce se ne mnogo posle odpakivanja i
rekontruisanja import tablice packer zavrsava i predaje dalje izvrsavanje
sada odpakovan kodu! Stoga cemo potraziti LoadLibraryA API:

004050BF    BB 28514000     MOV EBX,<&KERNEL32.LoadLibraryA>
004050C4    47              INC EDI
004050C5    8B37            MOV ESI,DWORD PTR DS:[EDI]
004050C7    AF              SCAS DWORD PTR ES:[EDI]
004050C8    57              PUSH EDI
004050C9    FF13            CALL NEAR DWORD PTR DS:[EBX]
004050CB    95              XCHG EAX,EBP
004050CC    33C0            XOR EAX,EAX
004050CE    AE              SCAS BYTE PTR ES:[EDI]
004050CF  ^ 75 FD           JNZ SHORT vct_crac.004050CE
004050D1    FE0F            DEC BYTE PTR DS:[EDI]
004050D3  ^ 74 EF           JE SHORT vct_crac.004050C4
004050D5    FE0F            DEC BYTE PTR DS:[EDI]
004050D7    75 06           JNZ SHORT vct_crac.004050DF
004050D9    47              INC EDI
004050DA    FF37            PUSH DWORD PTR DS:[EDI]
004050DC    AF              SCAS DWORD PTR ES:[EDI]
004050DD    EB 09           JMP SHORT vct_crac.004050E8
004050DF    FE0F            DEC BYTE PTR DS:[EDI]
004050E1  - 0F84 19BFFFFF   JE vct_crac.00401000

 Posto se kod pakera najcesce nalazi u nekom svom rasponu, a pakovani kod
u  nekom svom rasponu potrebno je pronaci neki skok ili CALL koji bi vodi
do  raspona  gde  ce  se  nalaziti  odpakovani  kod.  Posto vecina pakera
zadrzaja  originalne sekcije, to jest njihove tipove ovo ce nam pomoci da
pronadjemo  mesto  gde  ce se kod odpakovati. Potrebno je samo da u Ollyu
odemo  u  Memory  Map  prozor (ALT+M) i da tamo pronadjemo .CODE sekciju.
Zasto  bas .CODE? Zato sto ona u skoro svim slucajevima sadrzi odpakovani
kod! Dakle kada otvorimo Memory Map prozor videcemo sledece:

Memory map
Address    Size       Owner      Section    Contains      Type   Access
00400000   00001000   vct_crac              PE header     Imag   R     
00401000   00003000   vct_crac              code          Imag   R     
00404000   00001000   vct_crac                            Imag   R     
00405000   00001000   vct_crac              SFX,imports   Imag   R     

  Posto  stvarno postoji .CODE sekcija oticicemo u nju kako bi smo videli
sta se tamo nalazi. Posle duplog klika na sekciju code videcemo ovo:

00401000    6A 00           PUSH 0
00401002    0000            ADD BYTE PTR DS:[EAX],AL
00401004    0000            ADD BYTE PTR DS:[EAX],AL
00401006    0000            ADD BYTE PTR DS:[EAX],AL

  Gomila 0x00 bajtova? Da ovo znaci da se kod jos nije totalno odpakovao.
Kao  sto  vidite  samo  prvi bajt 0x6A se odpakovao. Iskoristicemo ovo...
Sada znamo dve cinjenice:

  [1] Odpakovani kod pocinje na adresi 00401000
  [2] Prvi bajt je vec odpakovan i on je 0x6A

  Posto  ce  FSG  kada  zavrsi  odpakivanje ocigledno predati izvrsavanje
adresi  00401000 zbog cega cemo njeno izvrsavanje presresti, a ovo ce nas
postaviti  na pravi OEP. Kako da presretnemo izvrsavanje adrese 00401000?
Pa postoji dosta tehnika ali ova je najjednostavnija:
  Desnim klikom na adresu 00401000 u Dump prozoru izaberite Breakpoint ->
Memory,  on access... Posle ovoga ostaje nam da startujemo program klikom
na F9 i sacekamo da dodjemo do adrese 00401000.
  Ali  program  nece  direktno  zastati na samom OEPu. Ne par puta ce FSG
pristupiti  adresama  00401000 i 00401001 pa cemo morati da pritisnemo F9
4x dok ne dodjemo do pravog OEPa na adresi 00401000, koji izgleda ovako:

00401000   .  6A 00         PUSH 0                     ; /pModule = NULL
00401002   .  E8 6D060000   CALL vct_crac.00401674     ; \GetModuleHandleA
00401007   .  A3 0A324000   MOV DWORD PTR DS:[40320A],EAX

  Sada  nam  ostaje  da  uradimo  full dump pomocu LordPEa i da popravimo
importe  pomocu  ImpReca.  Ovo  cemo  uraditi  po  koracima koje sam gore
opisao.
  Korak [2] uradicemo full dump. Ovo je ujedno i najlaksi korak, potrebno
je  samo upaliti LordPE i u njemu izabrati proces koji odpakujemo, u ovom
slucaju to ce biti vct_crackme2.exe i desnim klikom na njega cemo uraditi
full dump. 
  Korak  [3]  uradicemo popravku importa. Ovaj korak se moze uraditi i sa
ReVirginom i sa ImpRecom, mi cemo ga uraditi pomocu ImpReca. Posle starta
ImpReca u listi aktivnih procesa treba izabrati proces vct_crackme2.exe i
podesiti  sledece  parametre:
  [  OEP  ] = 00401000 - ImageBase (0040000) dakle  OEP  = 1000
 Ostale podatke mozete ostaviti kako jesu posle cega je potrebno odkaciti
opciju Add new section i pritisnuti dugme IAT AutoSearch, pa GetImports i
na  kraju  FixDump  posle  cega jos samo treba izabrati nas fajl koji smo
dumpovali pomocu LordPEa.
 Rezultat ovoga je odpakovan fajl! Uspeli smo!

--[ 0x04 ]---------------------------------------------[    Fishing     ]

  Posto  smo uspesno odpakovali metu vreme je da pronadjemo tacan seriski
broj za ovaj crackme. Verujte mi na rec ovo ce biti za nijansu lakse nego
odpakivanje  mete,  naravno uz pomoc odlicnog alata HexDecChara. Pocecemo
tako  sto  cemo otvoriti odpakovanu metu sa Olly debuggerom. Na OEPu cemo
videti ovo: 

00401000   .  6A 00         PUSH 0                     ; /pModule = NULL
00401002   .  E8 6D060000   CALL vct_crac.00401674     ; \GetModuleHandleA
00401007   .  A3 0A324000   MOV DWORD PTR DS:[40320A],EAX

  Posto  svi  crackmei  sadrze  poruke  o tacno/netacno unesenim seriskim
brojevima  pocecemo  tako sto cemo pretraziti sve string reference u ovom
fajlu.  Ovo  cemo  uraditi  klikom  na  desno  dugme -> Search for -> All
referenced  strings...  Posle  cega  cemo  pri  samom vrhu novo-otvorenog
prozora primetiti sledece reference:

Text strings referenced in dumped_:, item 16
 Address=004015B9
 Disassembly=PUSH dumped_.004031AC
 Text string=ASCII "Wow, PM to me for earn 2* :D"

Text strings referenced in dumped_:, item 17
 Address=004015D2
 Disassembly=PUSH dumped_.004031C9
 Text string=ASCII "Ha ha ha, sai be't ro^`i ;-) ! Try again."

   Ove  reference  predstavljaju takozvane GOOD BOY/BAD BOY poruke. One se
pojavljuju  u  zavisnosti  da  li  je uneti seriski broj tacan ili ne i u
njihovoj  fizickoj blizini se najcesce nalazi deo koda koji se koristi za
proveru  ispravnosti seriskog broja, stoga cemo duplim klikom na good boy
poruku zavrsiti na sledecem delu koda:

004015B8  |>  FC            CLD                              <- Good boy
004015B9  |.  68 AC314000   PUSH 004031AC                    ; /Text
004015BE  |.  FF35 1A324000 PUSH DWORD PTR DS:[40321A]       ; |hWnd
004015C4  |.  E8 87000000   CALL <JMP.&user32.SetWindowTextA>; \SetWTextA
004015C9  |.  B8 00000000   MOV EAX,0
004015CE  |.  5A            POP EDX
004015CF  |.  59            POP ECX
004015D0  |.  C3            RET
004015C9  |.  B8 00000000   MOV EAX,0
004015CE  |.  5A            POP EDX
004015CF  |.  59            POP ECX
004015D0  |.  C3            RET
004015D1  |>  FC            CLD                              <- Bad boy
004015D2  |.  68 C9314000   PUSH 004031C9                    ; /Text
004015D7  |.  FF35 1A324000 PUSH DWORD PTR DS:[40321A]       ; |hWnd
004015DD  |.  E8 6E000000   CALL <JMP.&user32.SetWindowTextA>; \SetWTextA
004015E2  |.  B8 00000000   MOV EAX,0
004015E7  |.  5A            POP EDX
004015E8  |.  59            POP ECX
004015E9  \.  C3            RET

  Ono sto nam je bitno je da pronadjemo skokove sa kojih se dolazi do bad
boy  poruke. Ovo je jako bitno jer se ova vrsta uslovnih skokova izvrsava
samo  posle  nekog  poredjenja,  a  to  poredjenje je najcesce poredjenje
seriskih  broja,  t.j. poredjenje unetog seriskog broja i tacnog seriskog
broja. Iz ovog razloga, da bi program imao sta da poredi, unose se lazni,
netacni seriski brojevi u cilju pronalaska tacnih seriskih brojeva.
  Ovo je jedna cinjenica koju morate da znate, a druga takodje jako bitna
je  da  se  veoma  cesto poredjenje seriskih brojeva i poruke o tacnosti,
t.j. netacnosti unetog seriskog broja nalaze u istom CALLu. Ova cinjenica
ce nam pomoci da pronadjemo gde i kako se to racuna seriski broj. Za sada
je  potrebno  da izolujemo celinu u kojoj se racuna seriski broj, to jest
da  sagledamo  ceo  ovaj  CALL. Ovo cemo uraditi jednostavnim scrollom na
pocetak ove celine, to jest CALLa, koji pocinje bas ovde:

0040141C  /$  51            PUSH ECX
0040141D  |.  52            PUSH EDX
0040141E  |.  6A 28         PUSH 28                          ; /Count = 28 (40.)
00401420  |.  68 70324000   PUSH dumped_.00403270            ; |Buffer = 00403270
00401425  |.  FF35 1A324000 PUSH DWORD PTR DS:[40321A]       ; |hWnd
0040142B  |.  E8 E4010000   CALL <JMP.&user32.GetWindowTextA>; \GetWTextA
00401430  |.  A3 FE314000   MOV DWORD PTR DS:[4031FE],EAX
00401435  |.  833D FE314000>CMP DWORD PTR DS:[4031FE],20
0040143C  |.  0F85 8F010000 JNZ dumped_.004015D1

  Kao sto se vidi sa pocetka ovog CALLa program ce uzeti podatke iz polja
za  unos  pomocu  API  funkcije  GetWindowTextA.  Ovo  je  jako  bitno da
zapazite,  to  jest  bitnije  je  da vidite na kojoj ce se adresi snimiti
procitani  tekst  iz  polja  za  unos.  Ovaj  podatak koji se prosledjuje
GetWindowTextA  APIju  je  oznacen kao buffer i sadrzi adresu 00403270 na
kojoj ce biti snimljen sadrzaj polja za unos.
  Na  ovoj  adresi  ce  se  nalaziti tekst, kome ce meta dalje pristupati
pomocu reference ka njemu, to jest preko njegove adrese. Isto kao sto ceo
tekst ima adresu na kojoj se nalazi, tako i svako slovo unetog teksta ima
svoju  adresu.  Ustvari  adresa  celog teksta predstavalj adresu ka prvom
slovu  unetog  teksta.  Stoga  cemo potraziti operacije koje se odnose na
adresu 00403270. Takve operacije cemo naci ovde:

00401442  |.  BB 70324000   MOV EBX,dumped_.00403270
00401447  |.  0FBE03        MOVSX EAX,BYTE PTR DS:[EBX]
0040144A  |.  83F8 34       CMP EAX,34
0040144D  |.  0F85 7E010000 JNZ dumped_.004015D1
00401453  |.  43            INC EBX
00401454  |.  0FBE03        MOVSX EAX,BYTE PTR DS:[EBX]
00401457  |.  83F8 44       CMP EAX,44
0040145A  |.  0F85 71010000 JNZ dumped_.004015D1
00401460  |.  43            INC EBX

  Kao  sto  vidimo prvo se sadrzaj adrese 00403270 smesta u registar EBX.
Ali  pazite  ne  smesta  se u EBX sadrzaj adrese 00403270, nego se smesta
referenca  ka  adresi,  a  sam  EBX  se  koristi kao pointer ka tekstu. U
slucaju kada je EBX jednak 00403270 on vodi do prvog slova unetog teksta,
sto  ce  biti  iskorisceno  vec  na sledecoj adresi, na kojoj ce se u EAX
smestiti  hexadecimalna  vrednost prvog slova unetog teksta. Primetite da
kako  se EBX povecava tako se u EAX smesta drugo slovo iz imena. Ovako se
proveravaju  sva  slova  iz unetog seriskog broja. Posto je ovaj kod jako
dugacak i prakticno predstavlja istu stvar ovde je "zalepljen" samo jedan
deo koda. Ali kako se poredi uneti seriski broj sa tacnim?
  Poredjenje se radi pomocu komande CMP! Secate se da smo rekli da ce EAX
sadrzati vrednosti svih unesenih slova. E pa iz tog razloga se EAX poredi
sa  raznim  brojevima  pomocu komande CMP. Sta su ovi brojevi? Ti brojevi
predstavljaju  hexadecimalne vrednosti slova tacnog seriskog broja. Pa ce
tako  prvo  slovo  seriskog broja iz razloga sto se EAX poredi sa 34 biti
broj  4, drugo slovo ce biti D iz razloga sto se EAX poredi sa 44, i tako
dalje...  Da  bi  ste pronasli ceo seriski broj potrebno je da pretrazite
ceo  kod  do  za  komandama  CMP  EAX,*.  Ovo  *  ce  predstavljati jedno
hexdecimalno slovo seriskog broja. Pretvaranje hexadecimalnih vrednosti u
slova  mozete  uraditi pomocu programa HexDecChar ili preko ASCII tablice
sa  adrese  www.ascitable.com.  Kako god da uradite pretvaranje brojeva u
slova dobicete da je tacan seriski broj: 4DEAD697C78633134D3A16C75CD6E2DB

--[ 0x05 ]---------------------------------------------[ Outro & Greetz ]

 Naravno ovo je bio jos jedan newbie tekst koji bi trebalo pocetnicima da
pokaze  kako  se  to  odpakuje FSG i "peca" seriski broj. Bas ovakve lake
primere  bi  trebalo  da  resavaju  svi  pocetnici  koji  zele da se bave
reversingom. Ostanite uz pH jer sledi jos jedan izvrstan reversing tekst.


Greetz:

SeekNDestroy   |   TSRh   |   EMiNENCE   |   CoolPHat   |   ELUSIVE | [ES]
  b4d_s3c70r | asphyx | B0r0 | loco | Kostolomac | Virus Krew | Jezgra

--[ EOF ]----------------------------------------------[  made by Ap0x  ]